Научете как да внедрите безпроблемна интернационализация (i18n) във вашите Next.js приложения, за да достигнете до глобална аудитория. Разглежда маршрутизиране, превод на съдържание и най-добри практики.
Интернационализация в Next.js: Създаване на многоезични приложения за глобална аудитория
В днешния взаимосвързан свят изграждането на приложения, които обслужват глобална аудитория, вече не е лукс – то е необходимост. Next.js, мощна React рамка, предоставя стабилни функции за внедряване на интернационализация (i18n), което ви позволява да създавате многоезични приложения, предоставящи локализирано изживяване на потребителите по целия свят. Това изчерпателно ръководство ще ви преведе през основните концепции, техники и най-добри практики за изграждане на интернационализирани Next.js приложения.
Разбиране на интернационализацията и локализацията
Преди да се потопим в спецификата на i18n в Next.js, нека изясним ключовите термини:
- Интернационализация (i18n): Процесът на проектиране и разработване на приложение, така че то да може лесно да се адаптира към различни езици и региони, без да са необходими инженерни промени. Това включва абстрахиране на текст, форматиране и други елементи, специфични за локала.
- Локализация (l10n): Процесът на адаптиране на приложение към конкретен език и регион. Това включва превод на текст, коригиране на формати за дата и час, символи на валути и др.
По същество i18n подготвя вашето приложение за локализация. Като отделяте езиково зависимите елементи от основния код, вие улеснявате локализирането на приложението за различни пазари.
Защо да внедряваме интернационализация в Next.js?
Внедряването на i18n във вашето Next.js приложение предлага множество предимства:
- Разширен обхват: Достигнете до по-широка аудитория, като предоставяте съдържание на предпочитания от тях език.
- Подобрено потребителско изживяване: Предложете по-персонализирано и ангажиращо изживяване за потребители в различни региони.
- Подобрено SEO: Подобрете оптимизацията за търсачки (SEO), като предоставяте локализирано съдържание, насочено към конкретни географски региони.
- Увеличени конверсии: Увеличете конверсиите, като представяте информация на родния език на потребителя, насърчавайки доверието и разбирането.
- Глобално присъствие на марката: Установете по-силно глобално присъствие на марката, като демонстрирате ангажираност към приобщаването и обслужването на разнообразна аудитория.
Функции и конфигурация на i18n в Next.js
Next.js предлага вградена поддръжка за i18n чрез своите функции за маршрутизиране и управление на съдържанието. Следва разбивка на важните функции:
1. Конфигуриране на i18n в next.config.js
Основната конфигурация за i18n се намира във файла next.config.js
. Ето един пример:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Масив от поддържани локали (езикови кодове)
defaultLocale: 'en', // Локал по подразбиране, който да се използва
localeDetection: true, // Активиране/деактивиране на автоматичното разпознаване на локал въз основа на настройките на браузъра (по избор)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Обяснение:
locales
: Масив, съдържащ езиковите кодове (напр.'en'
за английски,'es'
за испански,'fr'
за френски) на езиците, поддържани от вашето приложение. Уверете се, че спазвате езиковите кодове по ISO 639-1 за последователност.defaultLocale
: Езикът по подразбиране, който вашето приложение ще използва. Това е езикът, който се показва, ако в URL адреса не е посочен друг език или не е открит такъв от настройките на браузъра на потребителя. Изберете език, който е представителен за основната ви целева аудитория.localeDetection
: Булева стойност, която контролира дали Next.js автоматично ще открива предпочитания от потребителя език въз основа на настройките на браузъра му. Ако е зададено наtrue
, Next.js ще се опита да пренасочи потребителя към подходящата езикова версия на вашия сайт.domains
(по избор): Масив, който ви позволява да асоциирате локали с конкретни домейни. Това е полезно, ако имате отделни домейни за различни езици (напр.example.com
за английски,example.es
за испански).
2. Маршрутизиране с префикси за локал
Next.js автоматично добавя префикс към маршрутите с локала. Например, ако имате страница на /about
и локалът е 'es' (испански), URL адресът ще стане /es/about
. Това позволява различни езикови версии на страниците и дава възможност на търсачките да индексират съдържание за всеки локал. Рамката се грижи за пренасочването и маршрутизирането вместо вас.
3. Използване на useRouter
Hook
Hook-ът useRouter
от next/router
предоставя достъп до текущия локал и друга информация за маршрутизиране.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Текущ локал: {locale}
Налични локали: {locales.join(', ')}
Локал по подразбиране: {defaultLocale}
);
}
export default MyComponent;
Обектът router
предлага следните ключови свойства:
locale
: Текущо избраният локал (напр. 'en', 'es', 'fr').locales
: Масив с всички поддържани локали, дефинирани вnext.config.js
.defaultLocale
: Локалът по подразбиране, зададен вnext.config.js
.asPath
: Пътят, както е показан в браузъра, включително префикса на локала (напр./es/about
).pathname
: Пътят без префикса на локала (напр./about
).
Стратегии за превод на съдържание
След като сте конфигурирали вашето Next.js приложение за i18n, ще трябва да внедрите стратегии за превод на съдържанието. Ето няколко популярни подхода:
1. Използване на специализирана система за управление на преводи (TMS)
За мащабни проекти с много езици, TMS е силно препоръчителна. Популярните опции включват:
- Phrase: Облачно базирана TMS с интеграции за различни платформи, включително Next.js. Предлага функции за сътрудничество и автоматизирани работни процеси.
- Localize: Друга облачно базирана TMS, която поддържа широк набор от файлови формати и предоставя функции за управление на преводи.
- Crowdin: Мощна TMS, която е много популярна в общността с отворен код и се интегрира добре с Next.js, позволявайки на екипите ефективно да превеждат съдържание.
Предимства:
- Централизирано управление на преводите.
- Функции за сътрудничество за преводачи.
- Автоматизация на работните процеси за превод.
- Интеграция с вашия работен процес на разработка.
2. Създаване на JSON файлове за превод
За по-малки проекти използването на JSON файлове за съхранение на преводи е прост и ефективен метод.
Примерна структура на директориите:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Примерен en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Примерен es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Примерен MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Този подход осигурява гъвкавост и е лесен за по-малки проекти. Обикновено е лесен за актуализиране и поддръжка.
3. Използване на библиотека за преводи
Няколко JavaScript библиотеки улесняват превода на съдържание във вашите React компоненти.
next-i18next
: Популярна библиотека, специално създадена за Next.js. Тя се интегрира добре с рамката и предоставя функции като рендиране от страна на сървъра (SSR) и превод от страна на клиента.react-i18next
: Библиотека за i18n с общо предназначение за React. Можете да я използвате във вашите Next.js приложения, въпреки че може да изисква повече конфигурация в сравнение сnext-i18next
.
Пример с next-i18next
(Инсталация: npm install next-i18next i18next react-i18next
):
Създайте конфигурационен файл за i18n (напр. i18n.js
във вашата основна директория):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Създайте вашата Next.js конфигурация за next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// other configuration
}
module.exports = nextConfig
Добавете конфигурацията и импорта на превода във вашия _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Създайте папка и я попълнете с локалите за вашите преводи.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Примерен en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Използване на превода в компонент:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Този пример използва useTranslation
hook за извличане на преводи въз основа на текущия локал.
Обработка на динамични маршрути и статично генериране на сайтове (SSG)
Интернационализацията става по-сложна при работа с динамични маршрути (напр. публикации в блог, продуктови страници) и статично генериране на сайтове (SSG).
1. Динамични маршрути (напр. /blog/[slug])
За динамични маршрути ще трябва да генерирате правилните пътища за всеки локал по време на компилация, използвайки getStaticPaths
. Тази функция връща масив от пътища, които Next.js трябва да рендира предварително.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Извличане на данни за публикациите в блога
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // или 'blocking', ако искате да покажете състояние на зареждане
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Обяснение:
getStaticPaths
: Тази функция итерира през вашите публикации в блога и генерира път за всяка публикация и всеки локал. Обектътparams
съдържа параметрите на маршрута (напр. slug на публикацията в блога).locale
: Този параметър предоставя текущия локал, което ви позволява да извлечете преведеното съдържание за конкретния локал.fallback
: Определя как Next.js обработва пътища, които не са дефинирани вgetStaticPaths
.fallback: false
генерира 404 страници за недефинирани пътища.fallback: 'blocking'
рендира предварително страниците при поискване.
2. Статично генериране на сайтове (SSG) с getStaticProps
В getStaticProps
можете да извлечете преведено съдържание въз основа на параметъра locale
.
export async function getStaticProps({ params, locale }) {
// Извличане на съдържание въз основа на локала и параметрите
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Функцията getPostBySlug
трябва да извлече преведеното съдържание за дадения slug и локал, което може да бъде извлечено от вашите файлове с преводи, база данни или CMS.
3. Рендиране от страна на сървъра (SSR) с getServerSideProps
За съдържание, което трябва да бъде извлечено по време на заявката, използвайте getServerSideProps
. Това е полезно, ако съдържанието се променя често или е персонализирано за всеки потребител.
export async function getServerSideProps({ params, locale, req, res }) {
// Извличане на данни въз основа на локала и параметрите (напр. от база данни)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Най-добри практики за интернационализация в Next.js
Следването на тези най-добри практики ще ви помогне да изградите стабилни, поддържаеми и лесни за използване многоезични приложения:
- Планирайте отрано: Обмислете интернационализацията от самото начало на вашия проект. Много по-лесно е да я внедрите предварително, отколкото да я добавяте по-късно.
- Отделете съдържанието от кода: Съхранявайте целия преводим текст в отделни файлове (напр. JSON файлове или TMS) и избягвайте твърдото кодиране на текст директно във вашите компоненти.
- Използвайте система за управление на преводи (TMS): За по-големи проекти, TMS може да улесни процеса на превод и да подобри сътрудничеството.
- Тествайте обстойно: Тествайте вашето приложение на всички поддържани езици, за да гарантирате точни преводи, правилно форматиране и правилно рендиране на различни браузъри и устройства. Тествайте на реални устройства, не само на емулатори.
- Помислете за езици с писане отдясно наляво (RTL): Ако поддържате езици като арабски или иврит, уверете се, че вашият дизайн и оформление поддържат посоката на текста отдясно наляво. Next.js не се справя с това автоматично, така че са необходими CSS или други решения.
- Обработвайте форматирането на дата и час: Използвайте библиотеки или вградени функции, за да форматирате дати и часове според локала на потребителя. Moment.js и date-fns са две популярни библиотеки, които са полезни.
- Управлявайте форматирането на числа и валути: Форматирайте правилно числата и символите на валутите въз основа на локала на потребителя.
- Оптимизирайте SEO: Използвайте езиково-специфични мета тагове (
hreflang
), за да помогнете на търсачките да индексират правилно вашето съдържание. Включете езикови кодове във вашите URL адреси. - Приоритизирайте потребителското изживяване: Осигурете ясен и интуитивен начин за потребителите да превключват между езиците. Помислете за предлагане на автоматично разпознаване на езика въз основа на настройките на браузъра.
- Бъдете в крак с новостите: Поддържайте вашата Next.js версия и i18n библиотеки актуални, за да се възползвате от най-новите функции и корекции на сигурността.
- Помислете за достъпността (a11y): Уверете се, че вашето преведено съдържание е достъпно за потребители с увреждания. Осигурете алтернативен текст за изображенията и използвайте подходящи ARIA атрибути. Използвайте екранни четци за тестване.
SEO съображения за интернационализирани уебсайтове
Оптимизирането на вашия интернационализиран уебсайт за търсачки е от съществено значение за привличане на органичен трафик от цял свят. Ето някои ключови SEO най-добри практики:
hreflang
тагове: Внедретеhreflang
тагове в<head>
на вашия HTML, за да информирате търсачките за езиковите и регионалните варианти на вашето съдържание. Това е от решаващо значение за SEO. Например:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
и<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- Езиково-специфични URL адреси: Използвайте езикови кодове във вашите URL адреси (напр.
/en/about
,/es/acerca-de
). Това ясно показва езика на съдържанието както на потребителите, така и на търсачките. - Локализирано съдържание: Превеждайте съдържанието си точно и естествено. Машинните преводи трябва да бъдат прегледани от носител на езика.
- Локализирани мета описания и заглавия: Напишете уникални и завладяващи мета описания и заглавия за всеки език, за да подобрите процента на кликване в резултатите от търсенето.
- XML карти на сайта: Създайте и изпратете XML карти на сайта, които включват всички езикови варианти на вашите страници.
- Вътрешно свързване: Използвайте подходящи вътрешни връзки между езиковите версии на вашето съдържание.
- Проучване на ключови думи за конкретна държава: Проведете проучване на ключови думи на всеки език, за да идентифицирате термините, които потребителите търсят във всеки регион.
Пример: Изграждане на прост многоезичен блог
Нека създадем опростен пример за многоезичен блог, използвайки Next.js. Това ще предостави по-конкретна илюстрация за това как да приложим обсъдените по-горе концепции.
1. Настройка на проекта
Създайте нов Next.js проект:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Конфигуриране на i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Създаване на файлове за превод
Създайте папка locales
в основната директория и добавете следните JSON файлове:
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Създаване на компонента за публикация в блога (напр. components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Създаване на главната страница (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Този опростен пример демонстрира основните принципи на интернационализацията в Next.js. Можете да разширите тази основна рамка, за да включите по-сложни функции, като динамични маршрути и интеграция със системи за управление на преводи. Помислете за подобряване на връзките по-горе с компонента Link
и добавете съответния атрибут locale
.
6. Стартиране на приложението
Стартирайте приложението с:
npm run dev
Сега можете да получите достъп до вашия блог на http://localhost:3000
(английски), http://localhost:3000/es
(испански) и http://localhost:3000/fr
(френски). Трябва да видите заглавието и съдържанието на публикацията в блога, преведени въз основа на избрания локал.
Заключение
Next.js предоставя изчерпателен набор от функции за внедряване на интернационализация във вашите уеб приложения. Следвайки принципите и техниките, очертани в това ръководство, можете да създавате многоезични приложения, които предоставят локализирани изживявания на потребители по целия свят. Не забравяйте да планирате стратегията си за i18n отрано, да изберете правилния метод за превод за вашите нужди и да приоритизирате потребителското изживяване. С внимателно планиране и изпълнение можете да изградите приложения, които резонират с глобална аудитория и отключват нови възможности за растеж. Непрекъснатото учене, поддържането на актуалност с най-новите версии и най-добрите практики ще гарантират, че използвате ефективно вашите инструменти и технологии.
С напредването на технологиите очаквайте да се появят по-усъвършенствани функции за i18n. Способността да се достига до потребители от различни култури и езикови групи ще остане ключов приоритет за разработчиците на приложения по целия свят. Следователно, овладяването на основите на i18n е ценно умение, което ще повиши вашата стойност в днешния глобален пейзаж на разработка.